<?php

namespace tools\lib;

class Parameter
{
    /**
     * 创建类型
     * extend.main下的子目录名称
     * @var string
     */
    private $type = '';

    /**
     * 创建的文件名称
     * @var string
     */
    private $name = '';

    /**
     * @var string
     */
    private $file_name = '';

    /**
     * 一下参数是生成控制器以及控制器服务使用的参数
     */

    /**
     * application下的模块
     * @var string
     */
    private $module = '';

    /**
     * 方法名称
     * @var string
     */
    private $action = '';

    /**
     * 参数
     * @var array|string
     */
    private $params = [];

    /**
     * 响应类型
     * @var string
     */
    private $response = 'list';

    /**
     * @var string
     */
    private $summary = '';

    /**
     * @var string
     */
    private $description = '';

    /**
     * Parameter constructor.
     * @param array $options
     */
    public function __construct($options = [])
    {
        $this->init($options);

    }

    /**
     * 解析参数
     * @param $options
     * @return bool
     */
    private function init($options)
    {
        if (empty($options)) {
            return false;
        }

        if (!is_array($options)) {
            return $this->parse($options);
        }

        foreach ($options as $key => $option) {
            switch ($key) {
                case 'f':
                    $this->parse($option);
                    break;
                case 't':
                case 'type':
                    $this->setType($option);
                    break;
                case 'n':
                case 'name':
                    $this->setName($option);
                    break;
                case 'm':
                case 'module':
                    $this->setModule($option);
                    break;
                case 'a':
                case 'action':
                    $this->setAction($option);
                    break;
                case 'p':
                case 'params':
                    $this->setParams($option);
                    break;
                case 'r':
                case 'response':
                    $this->setResponse($option);
                    break;
                case 'summary':
                    $this->setSummary($option);
                    break;
                case 'description':
                    $this->setDescription($option);
                    break;
            }
        }

        return true;
    }

    /**
     *
     * 1. model/test 表示创建test对应model目录下的文件信息模型以及响应的文件(logic,validate等)
     *    可简写为 test
     * 2. controller/manager/test  表示创建 application/manager/controller/test.php文件
     *
     *    manager/test 表示创建application/manager/test.php 文件
     *
     *    c/manager/test 表示创建application/manager/controller/test.php文件
     *
     *    c/manager/test/index 表示创建application/manager/controller/test.php文件以及index方法
     *
     *    c/manager/test/index/id/1/pid/1  index后面的为参数
     *
     * 3. admin/test 表示创建test对应的extend/admin目录下的文件信息
     *    可简写为 a/test
     *
     * 4. document/manager/test/getInfo/id/1/
     *    简写为 d/manager/test/getInfo/
     *
     *    1. 创建manager/controller/test.php 的getInfo方法,参数为id
     *    2. 创建manager/controller/testService.php 的getInfo方法,参数为id
     *    3. 创建根目录下的/document/manager/paths/test/ 目录下的 get_info.json文件
     *
     * @param $params
     * @return bool
     */
    public function parse($params)
    {
        $params = explode('/', $params);

        $length = count($params);

        switch ($length) {
            case 1:
                $this->setType('model');
                $this->setName($params[0]);
                break;
            case 2:
                $this->setType($params[0]);
                $this->setName($params[1]);
                break;
            case 3:
                $this->setType('controller');
                $this->setModule($params[0]);
                $this->setName($params[1]);
                $this->setAction($params[2]);
                break;
            default:
                $this->setType('controller');
                $this->setModule($params[0]);
                $this->setName($params[1]);
                $this->setAction($params[2]);
                $this->setParams(array_slice($params, 3));
        }

        $type = $this->getType();

        /**
         * 默认的可以创建的类型
         */
        $paths = [
            config('path.lib_main_path'),
            config('path.lib_extend_path')
        ];
        $dir_name = '';
        foreach ($paths as $path) {
            $matches = glob($path . $type . '*');
            if (isset($matches[0]) && $matches[0]) {
                $dir_name = substr($matches[0], strrpos($matches[0], '/') + 1);
                break;
            }
        }

        if (empty($dir_name)) {
            dump('创建的类型不正确');
            return false;
        }

        return true;
    }

    /**
     * @return string
     */
    public function getType(): string
    {
        return $this->type;
    }

    /**
     * @param string $type
     * @return Parameter
     */
    public function setType(string $type): self
    {
        $this->type = $type;

        return $this;
    }

    /**
     * @return string
     */
    public function getModule(): string
    {
        return transToUnderline($this->module);
    }

    /**
     * @param string $module
     * @return Parameter
     */
    public function setModule(string $module): self
    {
        $this->module = $module;

        return $this;
    }

    /**
     * 创建的文件名称,如果作为目录使用,需要转化为下划线的方式(最终生成的文件名称,类名需要重新处理)
     * @return string
     */
    public function getName(): string
    {
        return transToUnderline($this->name);
    }

    /**
     * @param string $name
     * @return Parameter
     */
    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    /**
     * 文件名称
     * @return string
     */
    public function getFileName(): string
    {
        return $this->file_name;
    }

    /**
     * @param string $file_name
     * @return Parameter
     */
    public function setFileName(string $file_name): self
    {
        $this->file_name = $file_name;

        return $this;
    }

    /**
     * 方法名称,转化为驼峰命名法
     * @return string
     */
    public function getAction(): string
    {
        return transToCamelCase($this->action);
    }

    /**
     * @param string $action
     * @return Parameter
     */
    public function setAction(string $action): self
    {
        $this->action = $action;

        return $this;
    }

    /**
     * @return array
     */
    public function getParams(): array
    {
        return $this->params;
    }

    /**
     * @param string|array $params
     * @return $this
     */
    public function setParams($params): self
    {
        /**
         * 兼用
         *
         *  字符串形式 index/id=1,page_id=1,page_size=10
         *
         *           index/id=1/page_id=1/page_size/10
         *
         *  命令行形式 -p id=1,page_id=1,page_size=10
         *
         */

        if (is_array($params) && count($params) == 1) {
            $params = $params[0];
        }

        if (!is_array($params)) {
            $params = explode(',', $params);
        }

        $query = [];
        if ($params) {
            foreach ($params as $item) {
                $item = explode('=', $item);
                if (isset($item[0])) {
                    $query[$item[0]] = isset($item[1]) ? $item[1] : '';
                }
            }
        }

        $this->params = $query;

        return $this;
    }

    /**
     * @return string
     */
    public function getResponse(): string
    {
        return $this->response;
    }

    /**
     * @param string $response
     * @return Parameter
     */
    public function setResponse(string $response): self
    {
        $this->response = $response;

        return $this;
    }

    /**
     * @return string
     */
    public function getSummary(): string
    {
        return $this->summary;
    }

    /**
     * @param string $summary
     * @return Parameter
     */
    public function setSummary(string $summary): self
    {
        $this->summary = $summary;

        return $this;
    }

    /**
     * @return string
     */
    public function getDescription(): string
    {
        return $this->description;
    }

    /**
     * @param string $description
     * @return Parameter
     */
    public function setDescription(string $description): self
    {
        $this->description = $description;

        return $this;
    }
}